import { A } from './0_common';
/**
 * Pick<t,k> 
 * 从t中提取k个属性组成一个新的对象类型返回
 * !!! Keys extends keyof Type 保证Keys是Type的子集
 * 键值必须要有约束
 */
type _Pick<Type, Keys extends keyof Type> = {
  [K in Keys] : Type[K];
}
type Copy<Type> = {
  [K in keyof Type]: Type[K];
}

type A1 = _Pick<A, 'x'>;
type _A = Copy<A>;

//////////////////////

/**
 * Exclude<UnionType, Keys> 
 * 类型参数：联合类型
 * 从联合类型中删除指定类型
 * U extends K 其中U会自动遍历跟K去对比,所以这里的U可以看做是 item_U
 */

type _Exclude<U, K> = U extends K ? never : U;
type a = _Exclude<'x'|'y'|'z', 'z'>;

/**
 * Omit<Type, Keys> 
 * 从Type中删除Keys属性 
 */
type _Omit<Type, Keys extends keyof Type> = _Pick<Type, _Exclude<keyof Type, Keys>>

type A2 = _Omit<A, 'z'>;